//: Playground - noun: a place where people can play

import UIKit
import MilanoSDK

print("hello")

let router = MSRouter.shared
// 配置用于处理路由解析失败的回调函数 - 作用范围：全局
router.globalErrorHandler = { params in
    print("resolve failed: \(params)")
}

// 注册路由信息，目前支持两种方式：回调函数、UIViewController
router.map("/users", handler: { print($0) })
router.map("/users/:username", handler: { print($0) })
router.map("/users/:username/repos", target: { print($0) })
router.map("/repos/:username/:project", target: UIViewController.self)
router.map("/repos/:username/:project/issues", controller: UITableViewController.self)
router.map("https://api.github.com/users/:username/repos", target: "hello") // replace

// {
//    "users" : {
//        "_target" : "handler",
//        ":username" : {
//            "_target" : "handler",
//            "repos" : {
//                "_target" : "hello"
//            }
//        }
//    },
//    "repos" : {
//        ":username" : {
//            ":project" : {
//                "_target" : "controller",
//                "issues" : {
//                    "_target" : "controller"
//                }
//            }
//        }
//    }
// }

// 获取注册的路由信息
print(router.routes)

// let data = try! JSONSerialization.data(withJSONObject: router.routes, options: .prettyPrinted)
// print(String(data: data, encoding: .utf8)!.description)

// 匹配路由，返回路由关联的相关信息
router.match("/users")
router.match("/users/sunlubo")
let params1 = router.match("/users/sunlubo/repos?type=owner")
let params2 = router.match("/repos/sunlubo/js-examples")
router.match("/repos/sunlubo/js-examples/issues")
router.match("/issues")

URL(string: "msrouter://users")?.pathComponents
URL(string: "msrouter:///users")?.pathComponents

router.match("msrouter://users")
router.match("msrouter:///users")
router.match("http:///users")
router.match("test:///users")

// Scheme验证
router.schemes.append("test")
router.match("test:///users")

router.match("https://api.github.com/users/sunlubo/repos")

// 读取路由参数
let closure = params1!["_target"]!
type(of: closure)
closure is (Any) -> Void
params2?["_target"] is UIViewController.Type

// 打开页面
router.open("/users")
router.open("/users/sunlubo")
router.open("/repos/sunlubo/repos?type=owner")
router.open("/repos/sunlubo/js-examples/issues")
router.open("/repos")
router.open("/issues") { params in
    if let params = params {
        print("unknown target")
    } else {
        print("url is not matched")
    }
}

// 路由启用规则，用于线上控制界面的跳转，目前仅支持禁用以及Web界面替换，后续添加其他特性，如本地页面替换等
// 目前iOS开始禁止热更新机制，因此该功能对于解决线上BUG问题有很大帮助。
router.rules["/users"] = .disabled(cause: "test")
router.rules["/users/sunlubo"] = .web(url: "https://www.google.com")
router.open("/users")
router.open("/users/sunlubo")

let v1: Any = { (_: MSRouter.RouteParameters) -> Void in }
let v2: Any = UIViewController.self

v1 is MSRouter.RouteHandler
v1 is UIViewController.Type
v2 is UIViewController.Type
v2 is MSRouter.RouteHandler
"" is UIViewController.Type
